package com.face.managesystem.controller;

import com.face.managesystem.config.Result;
import com.face.managesystem.pojo.ManagerInfo;
import com.face.managesystem.service.ManagerService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.lang.NonNull;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.util.Arrays;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Map;

/**
 * 管理者 前端控制器。
 */
@RestController
public class ManagerMSController {

    /**
     * 管理者 service。
     */
    @Autowired
    private ManagerService managerService;

    /**
     * 获取管理者信息。
     * @param userID：管理者额ID。
     * @return
     *      获取的结果。
     */
    @GetMapping("/managerInfo/{userID}")
    public Result<ManagerInfo> managerInfo(@PathVariable("userID") String userID){
        System.out.println("userID = " + userID);

        // 获取管理者信息。
        if (userID!=null){
            ManagerInfo managerInfo = managerService.managerInfo(userID);
            System.out.println("managerInfo = " + managerInfo);
            if (managerInfo!=null){
                return new Result<>(200, "成功",managerInfo);
            }
            return new Result<>(0,"该管理者不存在");
        }
        return new Result<>(0,"对象为空");
    }

    /**
     * 获取普通管理者的登录状态。【进阶】【未做】
     * @param userID：管理者ID。
     * @return
     *      获取到的结果。
     */
    @GetMapping("/managerLoginInfo/manager/{userID}")
    public Result<String> managerLoginInfo(@PathVariable("userID") String userID){
        System.out.println("userID = " + userID);

        return new Result<>(200, "");
    }

    /**
     * 退出管理系统。
     * @param userID:管理者ID。
     * @return
     *      退出结果。
     */
    @GetMapping("/logout/{userID}")
    public Result<Map<String, String>> logout(HttpServletRequest request, HttpServletResponse response, HttpSession session, @PathVariable("userID") String userID){
        System.out.println("userID = " + userID);
        System.err.println("退出系统！");

        // 请求行
//        this.requestLine(request);
        // 请求头
//        this.requestHeader(request);
        // 请求体
//        this.requestBody(request);

//        response.setHeader("Cache-Control","no-cache,no-store");
//        response.setHeader("Pragma","no-cache");
//        response.setDateHeader ("Expires", -1);

        request.setAttribute("Referer","/");

        response.setHeader("Pragma","No-Cache");
        response.setHeader("Cache-Control","No-Cache,No-Store");
        response.setDateHeader("Expires", 0);

        session.invalidate();

//        Enumeration<String> headerNames = request.getHeaderNames();
//        headerNames.asIterator().forEachRemaining(System.out::println);

        Map<String, String> map = new HashMap<>();
        map.put("pageUrl","/");
        return new Result<>(302, "退出成功",map);
    }

    /**
     * 请求体 API 接口。
     * @param request
     */
    private void requestBody(HttpServletRequest request) {
        System.out.println("====================== 通过request获得请求体（请求参数） ======================");


        // 该方法用于返回一个包含请求消息中所有参数名的Enumeration对象，在此基础上，可以对请求消息中的所有参数进行遍历处理。
        Enumeration<String> parameterNames = request.getParameterNames();
        System.out.println("返回一个包含请求消息中所有参数名的Enumeration对象：");
        parameterNames.asIterator().forEachRemaining(System.out::println);

        // 个体Parameter Map()方法用于将请求消息中的所有参数名和值装入进一个Map对象中返回。
        Map<String, String[]> parameterMap = request.getParameterMap();
        System.out.println("将请求消息中的所有参数名和值装入进一个Map对象中返回：");
        parameterMap.entrySet().forEach(System.out::println);

        // 用于获取某个指定名称的参数值，如果请求消息中没有包含指定名称的参数，getParameter()方法返回null；如果指定名称的参数存在但没有设置值，则返回一个空串；如果请求消息中包含有多个该指定名称的参数，getParameter()方法返回第一个出现的参数值。
        String parameter = request.getParameter("userID");
        System.out.println("获取某个指定名称的参数值：" + parameter);
        // HTTP请求消息中可以有多个相同名称的参数（通常由一个包含有多个同名的字段元素的FORM表单生成），如果要获得HTTP请求消息中的同一个参数名所对应的所有参数值，那么就应该使用getParameterValues()方法，该方法用于返回一个String类型的数组。
        String[] parameterValues = request.getParameterValues("userID");
        System.out.println("HTTP请求消息中可以有多个相同名称的参数 =============");
        if (parameterValues!=null){
            Arrays.stream(parameterValues).iterator().forEachRemaining(System.out::println);
        }else {
            System.out.println("null");
        }
    }

    /**
     * 请求行 API 接口。
     * @param request
     */
    private void requestHeader(HttpServletRequest request) {
        System.out.println("==================== 通过request获得【请求头】 ====================");
        // 该方法用于获取一个包含所有请求头字段的Enumeration对象。
        Enumeration<String> headerNames1 = request.getHeaderNames();
        headerNames1.asIterator().forEachRemaining(System.out::println);

        // 用于获取一个指定头字段的值，如果请求消息中没有包含指定的头字段，getHeader()方法返回null；如果请求消息中包含有多个指定名称的头字段，getHeader()方法返回其中第一个头字段的值。
        String header = request.getHeader("accept");
        System.out.println("获取一个指定头字段的值：" + header);
        // 该方法返回一个Enumeration集合对象，该集合对象由请求消息中出现的某个指定名称的所有头字段值组成。在多数情况下，一个头字段名在请求消息中只出现一次，但有时候可能会出现多次。
        Enumeration<String> headers = request.getHeaders("content-type");
        headers.asIterator().forEachRemaining(System.out::println);

        // 用于获取指定名称的头字段，并且将其值转换为int类型。需要注意的是，如果指定名称的头字段不存在，返回值为-1；如果获取到的头字段的值不能转为int类型，将发生NumberFormatException异常。
        int intHeader = request.getIntHeader("content-length");
        System.out.println("获取指定名称的头字段：" + intHeader);
        // 用于获取指定头字段的值，并将其按GMT时间格式转换成一个代表日期/时间的长整数，这个长整数是自1970年1月1日0点0分0秒算起的以毫秒为单位的时间值。
        long dateHeader = request.getDateHeader("2022-11-05");
        System.out.println("获取指定头字段的值：" + dateHeader);
        //  用于获取Content-Type头字段的值，结果为String类型。
        String contentType = request.getContentType();
        System.out.println("获取Content-Type头字段的值：" +contentType);
        // 用于获取Content-Length头字段的值，结果为int类型。
        int contentLength = request.getContentLength();
        System.out.println("获取Content-Length头字段的值：" + contentLength);
        // 用于返回请求消息的实体部分的字符集编码，通常是从Content-Type头字段中进行提取，结果为String类型。
        String characterEncoding = request.getCharacterEncoding();
        System.out.println("返回请求消息的实体部分的字符集编码：" + characterEncoding);

    }

    /**
     * 请求行 API 接口。
     * @param request：
     */
    private void requestLine(HttpServletRequest request) {

        System.out.println("=================== 通过request获得 【请求行】 信息 ==========================");
        // 请求方式。
        String method = request.getMethod();
        System.out.println("请求方式：" + method);
        // 用于获取请求行中资源名称部分，即位于URL的主机和端口之后、参数部分之前的部分。
        String requestURI = request.getRequestURI();
        System.out.println("路径：" + requestURI);
        // 用于获取请求行中的参数部分，也就是资源路径后面问号以后的所有内容。
        String queryString = request.getQueryString();
        System.out.println("请求参数："+queryString);
        // 用于获取请求行中的协议名和版本，例如，HTTP/1.0 或 HTTP/1.1。
        String protocol = request.getProtocol();
        System.out.println("http协议版本：" + protocol);
        //用于获取请求URL中属于WEB应用程序的路径，这个路径以"/"开头，表示相对于整个WEB站点的根目录，路几个结尾不含“/”。如果请求URL属于web站点的根目录，那么返回结果为空字符串""。
        String contextPath = request.getContextPath();
        System.out.println("WEB目录：" + contextPath);
        // 用于获取Servlet的名称或 Servlet 所映射的路径。
        String servletPath = request.getServletPath();
        System.out.println("Servlet："+servletPath);
        // 用于获取请求客户端的IP地址，其格式类似于"192.168.0.1"。
        String remoteAddr = request.getRemoteAddr();
        System.out.println("获取客户端 IP 地址：" + remoteAddr);
        // 用于获取请求客户端的完整主机名，其格式类似于"pc1.xxxx.cn"。需要注意的是，如果无法解析出客户机的完整主机名，该方法会返回客户端的IP地址。
        String remoteHost = request.getRemoteHost();
        System.out.println("获取客户端完整的主机名：" + remoteHost);
        // 用于获取请求客户端网络连接的端口号。
        int remotePort = request.getRemotePort();
        System.out.println("获取客户端网络连接的端口号：" + remotePort);
        // 用于获取Web服务器上接收当前请求网络连接的IP地址。
        String localAddr = request.getLocalAddr();
        System.out.println("获取Web服务器上接收当前请求网络连接的IP地址：" + localAddr);
        // 用于获取Web服务器上接收当前网络连接IP所对应的主机名。
        String localName = request.getLocalName();
        System.out.println("获取Web服务器上接收当前网络连接IP所对应的主机名：" + localName);

        // 用于获取Web服务器上接收当前网络连接的端口号。
        int localPort = request.getLocalPort();
        System.out.println("获取Web服务器上接收当前网络连接的端口号：" +localPort);
        // 用于获取当前请求所指向的主机名，即HTTP请求消息中HOST头字段所对应的主机名部分。
        String serverName = request.getServerName();
        System.out.println("获取当前请求所指向的主机名：" + serverName);
        // 用于获取当前请求所连接的服务器端口号，即如果HTTP请求消息中HOST头字段所对应的端口号部分。
        int serverPort = request.getServerPort();
        System.out.println("获取当前请求所连接的服务器端口号：" + serverPort);
        // 用于获取请求的协议名，例如http、https或ftp。
        String scheme = request.getScheme();
        System.out.println("获取请求的协议名：" + scheme);
        // 用于获取客户端发出请求时的完整URL，包括协议、服务器名、端口号、资源路径等信息，但不包括后面的查询参数部分。注意，getRequestRUL()方法返回的时StringBuffer类型，而不是String类型。
        StringBuffer requestURL = request.getRequestURL();
        System.out.println("获取客户端发出请求时的完整URL：" + requestURL);

    }
}
